﻿/*****************************************************************
 * @file slide_switch.c
 * @brief 滑动开关驱动  通过ADC1采集开关电压确定开关状态
 * @details CPL(sw1)   PA3引脚
 *          SEN1(sw2)  PA2引脚
 *          SEN2(sw3)  PA1引脚
 *****************************************************************
 */

#include "slide_switch.h"
#include "main.h"
#include "adc.h"
#include "timer.h"
#include <stdbool.h>


/* 逻辑值定义 0--2分别对应滑动开关开始位置和末尾位置 */
#define LOGIC_VALUE_0 0
#define LOGIC_VALUE_1 1
#define LOGIC_VALUE_2 2


/**
 * @
 * @brief 私有函数 - 将电压值转换为逻辑值
 * @param[in] adcValue 电压值
 * @param[out] logicValue 输出的逻辑值
 */
static void Vsw2LogicValue(uint16_t adcValue, uint8_t *logicValue)
{
    configASSERT(logicValue);

    if(adcValue < 20) // 处于0电位 --> 逻辑0
    {
        *logicValue = LOGIC_VALUE_0;
    }
    else if(adcValue < 1030 && adcValue > 900) // 处于中间电位 --> 逻辑1
    {
        *logicValue = LOGIC_VALUE_1;
    }
    else // 处于高电位 --> 逻辑2
    {
        *logicValue = LOGIC_VALUE_2;
    }
}


/**
 * @brief 滑动开关初始化 (自动初始化)
 * @param None
 */
void SildeSwitchInit(void)
{
    Adc1GpioConfig();
    Adc1config();
    Timer1Config();
}
INIT_BSP_EXPORT(SildeSwitchInit);

/**
 * @brief 根据滑动开关电压值计算逻辑值
 * @param logicValue 逻辑值结构体
 */
void SlideSwitchGetValue(SlideSwitch_t *logicValue)
{
    /* 计算耦合选择开关逻辑值 */
    adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL_2);
    while(adc_flag_get(ADC1, ADC_FLAG_EOIC) != SET);
    uint16_t adc = adc_inserted_data_read(ADC1, ADC_INSERTED_CHANNEL_2);
    Vsw2LogicValue(adc, &logicValue->cpl);

    /* 计算满量程选择开关逻辑值 */
    adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL_1);
    while(adc_flag_get(ADC1, ADC_FLAG_EOIC) != SET);
    adc = adc_inserted_data_read(ADC1, ADC_INSERTED_CHANNEL_1);
    Vsw2LogicValue(adc, &logicValue->sen1);

    /* 计算增益倍数选择开关逻辑值 */
    adc_software_trigger_enable(ADC1, ADC_INSERTED_CHANNEL_0);
    while(adc_flag_get(ADC1, ADC_FLAG_EOIC) != SET);
    adc = adc_inserted_data_read(ADC1, ADC_INSERTED_CHANNEL_0);
    Vsw2LogicValue(adc, &logicValue->sen2);
}
